#include "stdlib.h"
#include "stdio.h"

typedef int ElemType;

typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

//头插法建立单链表
//不带头结点
void List1_HeadInsert(LinkList *L)
{
    LNode *s;ElemType x;
    (*L)=NULL;
    scanf("%d",&x);
    if(x!=9999)
    {
        *L= (LNode *)malloc(sizeof(LNode)); //创建第一个节点
        (*L)->data=x;
        (*L)->next=NULL;
    }
    else
    {
        return;
    }
    while(scanf("%d",&x)&&x!=9999)
    {
        s=(LNode *)malloc(sizeof(LNode));
        s->data=x;
        s->next = (*L);
        (*L) = s;
    }
    //return L;
}
//尾插法建立单链表
//不带头结点
void List1_TailInsert(LinkList *L)
{
    ElemType x;
    LNode *s,*r;
    (*L)=NULL;
    scanf("%d",&x);
    if(x!=9999)
    {
        *L= (LNode *)malloc(sizeof(LNode)); //创建第一个节点
        (*L)->next=NULL;
        (*L)->data=x;
        r=*L;
    }
    else
        return;
    while(scanf("%d",&x)&&x!=9999)
    {
        s = (LNode *)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
    }
    r->next=NULL;
}
//头插法建立单链表
//带头结点
void List_HeadInsert(LinkList *L)
{
    LNode *s;ElemType x;
    *L= (LinkList)malloc(sizeof(LNode)); //创建头节点
    (*L)->next=NULL;
    scanf("%d",&x);
    while(x!=9999)
    {
        s=(LNode *)malloc(sizeof(LNode));
        s->data=x;
        s->next = (*L)->next;
        (*L)->next = s;
        scanf("%d",&x);
    }
    //return L;
}
//尾插法建立单链表
//带头结点
void List_TailInsert(LinkList *L)
{
    ElemType x;
    *L= (LinkList)malloc(sizeof(LNode)); //创建头节点
    (*L)->next=NULL;
    LNode *s,*r=*L;
    scanf("%d",&x);
    while(x!=9999)
    {
        s = (LNode *)malloc(sizeof(LNode));
        s->data=x;
        r->next=s;
        r=s;
        scanf("%d",&x);
    }
    r->next=NULL;
}
//打印所有元素的值
//有头节点
void Printf_everyElem(LinkList L)
{
    LNode *p;
    p=L->next;
    while(p!=NULL)
    {
        printf("add:%x data:%d next:%x\n",p,p->data,p->next);
        p=p->next;
    }
}
//打印所有元素的值
//无头节点
void Printf1_everyElem(LinkList L)
{
    LNode *p;
    p=L;
    while(p!=NULL)
    {
        printf("add:%x data:%d next:%x\n",p,p->data,p->next);
        p=p->next;
    }
}
//打印结点信息
void Printf_Elem(LNode* N)
{
    if(N!=NULL)
        printf("add:%x data:%d next:%x\n",N,N->data,N->next);
}
//按序号查找结点
//带头节点
//与书不同
LNode *GetElem(LinkList L,int i)
{
    if(i<0)
        return NULL;
    int j=0;
    LNode *p=L;
    while (p!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    return p;
}
//按序号查找结点
//不带头节点
LNode *GetElem1(LinkList L,int i)
{
    if(i<1)
        return NULL;
    int j=1;
    LNode *p=L;
    while (p!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    return p;
}
//按值查找结点
LNode *LocateElem(LinkList L,ElemType e)
{
    LNode *p;
    p=L;
    while(p!=NULL&&p->data!=e)
    {
        p=p->next;
    }
    return p;
}
//插入节点,后向
//带头节点
int List_Insert_b(LinkList *L,int i,ElemType e)
{
    LNode *p,*s;
    p=GetElem(*L,i-1);
    if(p==NULL)
        return -1;
    s=(LNode *)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return 0;
}
//插入节点,前向(可以仅知道节点就插入到其前方)
//带头节点
int List_Insert_f(LinkList *L,int i,ElemType e)
{
    LNode *p,*s;
    ElemType temp;
    p=GetElem(*L,i);
    if(p==NULL)
        return -1;
    s=(LNode *)malloc(sizeof(LNode));
    s->data=e;

    s->next=p->next;
    p->next=s;
    temp=p->data;
    p->data=s->data;
    s->data=temp;
    return 0;
}
//删除第i个节点
//带头结点
int List_delete(LinkList *L,int i,ElemType *e)
{
    LNode *p,*q;
    p=GetElem(*L,i-1);
    if(p==NULL)
        return -1;
    q=p->next;
    p->next = q->next;
    *e = q->data;
    free(q);
    return 0;
}
//删除指定节点
//实际删除p的后继节点，把它的值移动到了p
int List_delete_node(LNode *p,ElemType *e)
{
    LNode *q;
    q=p->next;
    p->data=p->next->data;
    p->next=q->next;
    free(q);
}
//获得链长
//含头节点
int List_Getlen(LinkList L)
{
    LNode * p;
    int len=0;
    p=L->next;
    while(p!=NULL)
    {
        len++;
        p=p->next;
    }
    return len;
}
//获得链长
//不含头节点
int List1_Getlen(LinkList L)
{
    LNode *p;
    int len=0;
    p=L;
    while(p!=NULL)
    {
        len++;
        p=p->next;
    }
    return len;
}

int main(void)
{
    LinkList l1,l2;
    //List1_TailInsert(&l1);
    List_TailInsert(&l2);
    //Printf1_everyElem(l1);
    Printf1_everyElem(l2);
    printf("--%d--\n",List_Getlen(l2));
    //Printf_Elem(LocateElem(l1,1));
    //Printf_Elem(LocateElem(l2,1));
    // List_Insert_f(&l2,3,10);
    // Printf1_everyElem(l2);
    // ElemType k;
    // List_delete(&l2,3,&k);
    // Printf1_everyElem(l2);
    return 0;
}